/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
 * bocciawii
 * Copyright (C) Grupo de trabajo ULE 2010 <ulewii@googlegroups.com>
 * 
 * teclado is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * teclado is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "barra.h"


Barra::Barra(std::string id):Elemento(id)
{
	_percent = 50;

	_fgColor = new float(3);

	for (int i = 0; i < 3; i++)
		_fgColor[i] = 1.0f;

	_bgColor = new float(3);
	for (int i = 0; i < 3; i++)
		_bgColor[i] = .3;
	
	_posBar.x_inicio = 0;
	_posBar.y_inicio = 0;
	_posBar.x_final = 0;
	_posBar.y_final = 0;
	_posBar.ancho = 100;
	_posBar.alto = 20;  // Hardcoded, no necesitaremos barras más anchas.

}

Barra::~Barra()
{
}
	
void Barra::SetPercent(int percent)
{
	_percent = percent;
}

void Barra::SetSize(int size)
{
	_posBar.ancho = size;
}

void Barra::SetBGColor(float* color)
{
	for (int i = 0; i < 3; i++)
		_bgColor[i] = color[i];
}

void Barra::SetFGColor(float* color)
{
	for (int i = 0; i < 3; i++)
		_fgColor[i] = color[i];
}


int* Barra::GetScreenCoords()
{
	int *espacio = new int(4);

	espacio[0] = _centro_x - GetNeededSpace()[0] / 2 - _spacing;
	espacio[1] = _centro_x + GetNeededSpace()[0] / 2 + _spacing;
	espacio[2] = _centro_y - GetNeededSpace()[1] / 2 - _spacing;
	espacio[3] = _centro_y + GetNeededSpace()[1] / 2 + _spacing;
	return espacio;
}

int* Barra::GetNeededSpace()
{
	int* espacio = new int(2);

	if (_image != 0 && _image != -1)
		switch (_posImg.alignment)
		{
			case IMG_ALIGN_LEFT:
			case IMG_ALIGN_RIGHT:
				espacio[0] = _posImg.ancho + _spacing + _posBar.ancho;
				espacio[1] = _posImg.alto > _posBar.alto ? _posImg.alto : _posBar.alto;
				break;
			case IMG_ALIGN_BELOW:
			case IMG_ALIGN_ABOVE:
				espacio[0] = _posImg.ancho > _posBar.ancho ? _posImg.ancho : _posBar.ancho;
				espacio[1] = _posImg.alto + _spacing + _posBar.alto;
				break;
		}
	else
	{
		espacio[0] = _posBar.ancho;
		espacio[1] = _posBar.alto;
	}
	

	return espacio;
}

void Barra::Pack(int centro_x, int centro_y)
{
	int* espacio = GetNeededSpace();

	// Tenemos centros y el espacio máximo necesitado.
	// Pues calculamos, a partir del centro, dependiendo de la alineación de la imagen
	//  etcétera etcétera
	int* centro = new int(2);
	centro[0] = centro_x;
	centro[1] = centro_y;

	_centro_x = centro_x;
	_centro_y = centro_y;


	if (_image != 0 && _image != -1)
		switch (_posImg.alignment)
		{
			case IMG_ALIGN_LEFT:
				_posImg.x_inicio = centro[0] - espacio[0] / 2;
				_posImg.y_inicio = centro[1] - _posImg.alto / 2;
				_posImg.x_final = _posImg.x_inicio + _posImg.ancho;
				_posImg.y_final = _posImg.y_inicio + _posImg.alto;

				_posBar.x_inicio = _posImg.x_final + _spacing;
				_posBar.y_inicio = centro[1] - _posBar.alto / 2;
				_posBar.x_final = _posBar.x_inicio + _posBar.ancho;
				_posBar.y_final = _posBar.y_inicio + _posBar.alto;
				break;
				
			case IMG_ALIGN_RIGHT:
				_posImg.y_inicio = centro[1] - _posImg.alto / 2;
				_posImg.y_final = _posImg.y_inicio + _posImg.alto;
				_posImg.x_final = centro[0] + espacio[0] / 2;
				_posImg.x_inicio = _posImg.x_final - _posImg.ancho;

				
				_posBar.x_inicio = centro[0] - espacio[0] / 2;
				_posBar.y_inicio = centro[1] - _posBar.alto / 2;
				_posBar.x_final = _posBar.x_inicio + _posBar.ancho;
				_posBar.y_final = _posBar.y_inicio + _posBar.alto;
				break;

			case IMG_ALIGN_ABOVE:
				_posImg.x_inicio = centro[0] - _posImg.ancho / 2;
				_posImg.y_inicio = centro[1] - espacio[1] / 2;
				_posImg.x_final = _posImg.x_inicio + _posImg.ancho;
				_posImg.y_final = _posImg.y_inicio + _posImg.alto;

				
				_posBar.x_inicio = centro[0] - _posBar.ancho / 2;
				_posBar.y_inicio = _posImg.y_final + _spacing;
				_posBar.x_final = _posBar.x_inicio + _posBar.ancho;
				_posBar.y_final = _posBar.y_inicio + _posBar.alto;
				break;
				
			case IMG_ALIGN_BELOW:
				_posImg.x_inicio = centro[0] - _posImg.ancho / 2;
				_posImg.y_final = centro[1] + espacio[1] / 2;
				_posImg.x_final = _posImg.x_inicio + _posImg.ancho;
				_posImg.y_inicio = _posImg.y_final - _posImg.alto;

				
				_posBar.x_inicio = centro[0] - _posBar.ancho/2;
				_posBar.y_inicio = centro[1] - espacio[1] / 2;
				_posBar.x_final = _posBar.x_inicio + _posBar.ancho;
				_posBar.y_final = _posBar.y_inicio + _posBar.alto;
				break;
		}
	else
	{
		_posBar.x_inicio = centro[0] - espacio[0] / 2;
		_posBar.y_inicio = centro[1] - espacio[1] / 2;
		_posBar.x_final = _posBar.x_inicio + _posBar.ancho;
		_posBar.y_final = _posBar.y_inicio + _posBar.alto;
	}
}
	
void Barra::Dibujar()
{
	if (_image != 0 && _image != -1)
	{
		glEnable(GL_BLEND);
		
		glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, _image); 
		glBegin(GL_QUADS);
			glTexCoord2f(0,0);
			glVertex2i(_posImg.x_inicio, _posImg.y_inicio);
			glTexCoord2f(1,0);
			glVertex2i(_posImg.x_final, _posImg.y_inicio);
			glTexCoord2f(1, 1);
			glVertex2i(_posImg.x_final, _posImg.y_final);
			glTexCoord2f(0, 1);
			glVertex2i(_posImg.x_inicio, _posImg.y_final);
		glEnd();
		glDisable(GL_TEXTURE_2D);
		
		glDisable(GL_BLEND);
	}

	
	glBegin(GL_LINE_LOOP);
		glVertex2i(_posBar.x_inicio -1, _posBar.y_inicio-1);
		glVertex2i(_posBar.x_final +1, _posBar.y_inicio-1);
		glVertex2i(_posBar.x_final +1, _posBar.y_final+1);
		glVertex2i(_posBar.x_inicio -1, _posBar.y_final+1);
	glEnd();

	int dest_x = _posBar.ancho * _percent / 100 + _posBar.x_inicio;
	
	float col_r = _percent * _fgColor[0] / 100 
		+ (100 - _percent) * _fgColor[0] / 100;
	float col_g = _percent * _fgColor[1] / 100 
		+ (100 - _percent) * _fgColor[1] / 100;
	float col_b = _percent * _fgColor[2] / 100 
		+ (100 - _percent) * _fgColor[2] / 100;
	
	glBegin( GL_QUADS );

		glColor3f(_bgColor[0], _bgColor[1], _bgColor[2]);
		glVertex2i(_posBar.x_inicio, _posBar.y_inicio);
		glVertex2i(_posBar.x_inicio, _posBar.y_final);

		glColor3f(col_r, col_g, col_b);
		glVertex2i(dest_x, _posBar.y_final);
		glVertex2i(dest_x, _posBar.y_inicio);
	
	glEnd ( );
}
